package net.lgy.config;


import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.ObjectInputFilter;


/**
 * Redisson 配置类
 * <p>
 * 用于初始化 Redisson 客户端，提供分布式锁等 Redis 高级功能支持。
 * Redisson 是基于 Redis 的 Java 分布式工具库，相比原生 Redis 客户端，
 * 提供了更完善的分布式锁实现（可重入、自动续期、公平锁等）。
 */
@Configuration // 标记为配置类，Spring 启动时会加载此类并初始化 Bean
@EnableCaching // 启用 Spring 缓存注解支持（如 @Cacheable），与 Redisson 锁功能无关，可根据需求保留
@ConfigurationProperties(prefix = "spring.data.redis")
public class RedissionConfiguration {

    /**
     * 从配置文件读取 Redis 主机地址
     * 对应配置项：spring.redis.host（如 127.0.0.1 或远程服务器 IP）
     */

    @Value("${spring.data.redis.host}")
    private  String redisHost;

    /**
     * 从配置文件读取 Redis 端口号
     * 对应配置项：spring.redis.port（默认 6379）
     */
    @Value("${spring.data.redis.port}")
    private  int redisPort;

    /**
     * 从配置文件读取 Redis 密码
     * 对应配置项：spring.redis.password（若 Redis 未设置密码则为空）
     */
//    @Value("${spring.redis.password}")
//    private String redisPwd = "";

    /**
     * 初始化单机模式的 Redisson 客户端
     * <p>
     * RedissonClient 是 Redisson 的核心接口，提供了分布式锁、分布式集合等所有功能的入口。
     * 此方法通过 @Bean 注解将 RedissonClient 注册到 Spring 容器，可在其他组件中直接注入使用。
     *
     * @return RedissonClient 实例，用于操作分布式锁等功能
     */
    @Bean
    public RedissonClient redissonClient(){
        // 1. 创建 Redisson 配置对象
        Config config = new Config();

        // 2. 配置单机模式的 Redis 连接
        // setPassword(redisPwd)：设置 Redis 密码（若未设置密码可省略此方法）
        // setAddress("redis://" + redisHost + ":" + redisPort)：设置 Redis 地址，格式为 "redis://ip:port"
        // 注意：Redis 未启用 SSL 时用 "redis://"，启用时用 "rediss://"
        config.useSingleServer()
//                .setPassword(redisPwd)
                .setAddress("redis://" + redisHost + ":" + redisPort).setConnectionPoolSize(128) ;

        // 可选高级配置（根据实际需求添加）
//         .setConnectionPoolSize(64)          // 连接池大小（默认 64）
        // .setConnectionMinimumIdleSize(10)   // 最小空闲连接数（默认 10）
        // .setIdleConnectionTimeout(10000)    // 空闲连接超时时间（毫秒，默认 10000）
        // .setTimeout(3000)                   // 命令执行超时时间（毫秒，默认 3000）

        // 3. 根据配置创建 Redisson 客户端实例
        RedissonClient redissonClient = Redisson.create(config);

        // 4. 返回客户端实例，注册到 Spring 容器
        return redissonClient;
    }

    /**
     * 集群模式配置示例（注释掉，需要时可启用）
     * <p>
     * 适用于 Redis 集群环境（如 3 主 3 从架构），通过添加多个节点地址实现集群连接。
     * 集群模式下，Redisson 会自动发现集群中的所有节点，并支持故障转移。
     *
     * @return 集群模式的 RedissonClient 实例
     */
    /*@Bean
    public RedissonClient redissonClusterClient() {
        // 1. 创建配置对象
        Config config = new Config();

        // 2. 配置集群模式
        config.useClusterServers()
              .setScanInterval(2000) // 集群节点状态扫描间隔（毫秒，默认 2000）
              // 添加集群节点地址（至少需要配置一个主节点，Redisson 会自动发现其他节点）
              .addNodeAddress("redis://127.0.0.1:7000")
              .addNodeAddress("redis://127.0.0.1:7002")
              // 可选：设置 Redis 密码（集群所有节点密码需一致）
              // .setPassword("your_redis_password")
              // 可选：设置连接池大小
              // .setMasterConnectionPoolSize(64)
              // .setSlaveConnectionPoolSize(64);

        // 3. 创建并返回集群模式的客户端实例
        RedissonClient redisson = Redisson.create(config);
        return redisson;
    }*/

}
